#pragma once

#include "btBulletDynamicsCommon.h"


/// Inicjalizuje srodowisko Bullet Physics
class World
{

private:
	/// Lista stworzonych obiektow
	btAlignedObjectArray<btRigidBody*> createdObjects;
	/// Wskaznik na klase podstawowego swiata.
	btCollisionWorld* world;
	/// Wskaznik na klase odpowiedzialna za organizacje hierarchii bryl otaczajacych.
	btDbvtBroadphase* broadphase;
	/// Wskaznik na klase opisujaca konfiguracje kolizji
	btDefaultCollisionConfiguration* collisionConfiguration;
	/// Wskaznik na klase opisujaca dyspozytora kolizji
	btCollisionDispatcher* dispatcher;

	/** Tworzy obiekt o zadanym ksztalcie, transformacji i masie
	* @param collisionShape Ksztal obiektu
	* @param startTransform Transformacja obiektu
	* @param mass Masa obiektu
	* @return Wskaznik na utworzony obiekt.
	*/
	static btRigidBody* CreateFigure(btCollisionShape* collisionShape, btTransform& startTransform, btScalar mass = 0.0f);
public:
	/// Konstruktor
	World(void);
	/// Destruktor
	~World(void);
	/// Zwalnia zasoby i zamyka srodowisko Bullet
	void Shutdown();
	/** Dodaje do sceny prostopadloscian.
	* @param halfSize Wektor zawierajacy polowy dlugosci bokow prostopadloscianu.
	* @param startTransform Transformacja obiektu.
	* @param mass Masa prostopadloscianu.
	*/
	void AddBox(btVector3& halfSize, btTransform& startTransform, btScalar mass = 0.0f);

	/** Tworzy nowy prostopadloscian ktory nie jest dodawany do sceny.
	* @param halfSize Wektor zawierajacy polowy dlugosci bokow prostopadloscianu.
	* @param startTransform Transformacja obiektu.
	* @param mass Masa prostopadloscianu.
	* @return Wskaznik na nowy prostopadloscian.
	*/
	static btRigidBody* CreateBox(btVector3& halfSize, btScalar mass = 0.0f);

	/** Usuwa ze sceny dany obiekt
	* @param body Obiekt do usuniecia.
	*/
	void DestroyFigure(btRigidBody* body);
	//void AddSphere(btScalar radius, btTransform& startTransform, btScalar mass = 0.0f);
	/// Usuwa ze sceny wszystkie obiekty
	void ClearWorld();

	/// Zwraca wskaznik na klase swiata.
	btCollisionWorld* GetWorld();


};

